package ejbSessions;

import javax.ejb.Stateless;

import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import EJBPackage.*;

import javax.persistence.*;

/**
 * Session Bean implementation class ManagerUtente
 */
@Stateless
public class ManagerUtente implements ManagerUtenteRemote, ManagerUtenteLocal {
	@PersistenceContext(unitName= "SWIMv2")
	private EntityManager db;
	
    public ManagerUtente() {
    }
    
	public Set<Abilita> getAbilita(int idUtente) {
		Set<Abilita> abilita = null;
		try{
			Utente utente;
			Query cercaUtente = db.createQuery("FROM Utente ut WHERE ut.id=:idUtente");
			cercaUtente.setParameter("idUtente", idUtente);
			utente = (Utente)cercaUtente.getSingleResult();			
			abilita = utente.getAbilita();
		}catch (Exception e) {
			e.printStackTrace();
		}
		return abilita;
	}

	public List<RichiestaAiuto> getRichiesteInoltrate(int idUtente) {
		List<RichiestaAiuto> richiesteAiuto = null;
		try{
			Query cercaRichiesteInoltrate = db.createQuery("FROM RichiestaAiuto r WHERE r.mittente=:utente ORDER BY r.dataInoltro");
			Query cercaUtente = db.createQuery("FROM Utente u WHERE u.id=:idUtente");
			Utente u;
			cercaUtente.setParameter("idUtente", idUtente);
			u = (Utente) cercaUtente.getSingleResult();
			cercaRichiesteInoltrate.setParameter("utente", u);
			richiesteAiuto = cercaRichiesteInoltrate.getResultList();
		}catch (Exception e) {
			e.printStackTrace();
		}
		return richiesteAiuto;
	}

	public List<RichiestaAiuto> getRichiesteRicevute(int idUtente) {
		List<RichiestaAiuto> richiesteAiuto = null;
		try{
			Query cercaRichiesteRicevute = db.createQuery("FROM RichiestaAiuto r WHERE r.destinatario=:utente ORDER BY r.dataInoltro");
			Query cercaUtente = db.createQuery("FROM Utente u WHERE u.id=:idUtente");
			Utente u;
			cercaUtente.setParameter("idUtente", idUtente);
			u = (Utente) cercaUtente.getSingleResult();
			cercaRichiesteRicevute.setParameter("utente", u);
			richiesteAiuto = cercaRichiesteRicevute.getResultList();
		}catch (Exception e) {
			e.printStackTrace();
		}
		return richiesteAiuto;
	}

	public Set<Utente> getAmici(int idUtente) {
		Set<Utente> amici = null;
		
		try{
			Utente utente;
			Query cercaUtente = db.createQuery("FROM Utente ut WHERE ut.id=:idUtente");
			cercaUtente.setParameter("idUtente", idUtente);
			utente = (Utente)cercaUtente.getSingleResult();
			amici = new HashSet(utente.getAmici1());
			amici.addAll(utente.getAmici2());
		}catch (Exception e) {
		}
		
		return amici;
	}

	public List<Feedback> getFeedback(int idUtente) {
		List<Feedback> feedback = null;
		try{
			Query cercaFeedback= db.createQuery("FROM Feedback f WHERE f.utente=:idUtente");
			cercaFeedback.setParameter("idUtente", idUtente);
			feedback = cercaFeedback.getResultList();
		}catch (Exception e) {
		}
		return feedback;
	}

	public Set<Notifica> getNotifiche(int idUtente) {
		Set<Notifica> notifica= null;
		try{
			Utente utente;
			Query cercaUtente = db.createQuery("FROM Utente ut WHERE ut.id=:idUtente");
			cercaUtente.setParameter("idUtente", idUtente);
			utente = (Utente)cercaUtente.getSingleResult();			
			notifica = utente.getNotifica();
		}catch (Exception e) {
		}
		return notifica;
	}

	@Override
	public int addUtente(Utente nuovoUtente) {
		db.persist(nuovoUtente);
		return nuovoUtente.getId();
	}

	@Override
	public Utente getUtente(int idUtente) {
		Utente utente=null;
		try{
			Query cercaUtente = db.createQuery("FROM Utente ut WHERE ut.id=:idUtente");
			cercaUtente.setParameter("idUtente", idUtente);
			utente = (Utente)cercaUtente.getSingleResult();			
		}catch (Exception e) {
			e.printStackTrace();
		}
		return utente;
	}
	
	public void updateUtente(int idUtente, String nome, String cognome, String indirizzo, String telefono){
		Utente utente = getUtente(idUtente);
		utente.setNome(nome);
		utente.setCognome(cognome);
		utente.setIndirizzo(indirizzo);
		utente.setTelefono(telefono);
		db.flush();
	}

	@Override
	public List<Utente> cercaUtente(String nome, String cognome) {
		List<Utente> utenti = null;
		try{
			if(nome!=null && cognome!=null && !nome.equals("") && !cognome.equals("")){
				Query cercaUtente = db.createQuery("FROM Utente ut WHERE ut.nome=:nome AND ut.cognome=:cognome");
				cercaUtente.setParameter("nome", nome);
				cercaUtente.setParameter("cognome", cognome);
				utenti = (List<Utente>)cercaUtente.getResultList();	
			}else{
				if(nome!=null && !nome.equals("")){
					Query cercaUtente = db.createQuery("FROM Utente ut WHERE ut.nome=:nome");
					cercaUtente.setParameter("nome", nome);
					utenti = (List<Utente>)cercaUtente.getResultList();	
				}
				if(cognome!=null && !cognome.equals("")){
					Query cercaUtente = db.createQuery("FROM Utente ut WHERE ut.cognome=:cognome");
					cercaUtente.setParameter("cognome", cognome);
					utenti = (List<Utente>)cercaUtente.getResultList();	
				}
			}

		}catch (Exception e) {
			e.printStackTrace();
		}
		return utenti;
	}
}
